import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * esta clase corresponde al enemigo mas debil el cual posee la menor salud y sus balas causan el menor danio 
 * 
 * @author (Octavio y Cesar) 
 * @version (2014.11.28)
 */
public class Ghost extends Enemy
{
    private Guns gun;
    private Timer time;
    private int dir; 
    private int vel; 
    
    /**
     * contructor de variables de la clase Ghost
     */
    
    public Ghost()
    {
        super(100,0); 
        gun=new Guns();
        time=new Timer();
        dir=3;
        vel=3;
        
        GreenfootImage image=getImage();
        image.scale(40,40);
        setImage(image);
    }

    /**
     * sobrecarga de constructor 
     * @param una posision en x y una posision en y
     */
    public Ghost(int x,int y)
    {
        super(100,0); 
        gun=new Guns();
        time=new Timer();
        dir=1;
        vel=10;
        
        GreenfootImage image=getImage();
        image.scale(40,40);
        setImage(image);
    }

    /**
     * Act - do whatever the enemy0 wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() 
    {
        // Add your action code here.    

        this.changeDir();
        this.fly();
        this.shoot();
        super.checaVida();
        this.sumaPuntos();
    }  
    
    /**
     * metodo que cambia la direccion checando los 4 extremos de la pantalla
     */
    public void changeDir()
    {
        switch(dir)
        {
            case 1:
            if(getY()<=0)
            {
                setLocation(getX()+vel,getY()+vel);
                dir=2;
            } 
            if(getX()>=getWorld().getWidth())
            {
                setLocation(getX()-vel,getY()-vel);
                dir=4;
            }
            break;
            case 2:if(getY()>=getWorld().getHeight())
            {
                dir=1;
                setLocation(getX()+vel,getY()-vel); 
            }
            if(getX()>=getWorld().getWidth())
            {
                dir=3;
                setLocation(getX()-vel,getY()+vel); 
            }
            break;
            case 3:if(getY()>=getWorld().getHeight())
            {
                dir=4;
                setLocation(getX()-vel,getY()-vel); 
            }

            if(getX()<=0)
            { 
                dir=2;
                setLocation(getX()+vel,getY()+vel); 
            }
            break;
            case 4:if(getY()<=0)
            {
                setLocation(getX()-vel,getY()+vel); 
                dir=3;
            }

            if(getX()<=0)
            {
                setLocation(getX()+vel,getY()-vel); 
                dir=1;
            } 
            break;     
            default:

        }

    }
    
    /**
     * metodo que mueve al ghost simulando que esta rebotando en la pantalla dependiendo
     * su direccion
     */
    public void fly()
    {

        switch(dir)
        {
            case 1: 
            setLocation(getX()+vel,getY()-vel); 
            break;
            case 2:
            setLocation(getX()+vel,getY()+vel);  
            break;
            case 3:
            setLocation(getX()-vel,getY()+vel);
            break;
            case 4:
            setLocation(getX()-vel,getY()-vel);
            break;     
            default:

        }

    }
    
    /**
     * metodo que crea el laser enemigo y reproduce un sonido
     */
    public void shoot()
    {
        GreenfootSound bulletSound=new GreenfootSound("boom.wav");
        int var= Greenfoot.getRandomNumber(100); 
        time.increases();
        if(var<5)       
        {

            Guns bullet;
            bullet= new ELaser();
            GreenfootImage myImage=this.getImage();
            getWorld().addObject(bullet,this.getX(),this.getY()+myImage.getHeight());
            bulletSound.setVolume(30);
            bulletSound.play();
            time.reset();
        }

    }
    /**
     * metodo que checa la vida la nave enemiga si es menor a cero le suma una cantidad de puntos al heroe 
     */
     public void sumaPuntos()
    {
        if(getHealth()<0)
         {
            ((Space)getWorld()).getHero().setPoints(100);
            (new GreenfootSound("exploPop.wav")).play();
            getWorld().removeObject(this);  
         }
    }
}
